from mcp.server.fastmcp import FastMCP
from typing import Union

# 创建 MCP 服务实例
mcp = FastMCP("Calculator Server")

@mcp.tool()
def add(a: float, b: float) -> str:
    """加法运算
    
    Args:
        a: 第一个数字
        b: 第二个数字
        
    Returns:
        加法运算结果
    """
    try:
        result = a + b
        return f"{a} + {b} = {result}"
    except Exception as e:
        return f"加法运算失败: {str(e)}"

@mcp.tool()
def subtract(a: float, b: float) -> str:
    """减法运算
    
    Args:
        a: 被减数
        b: 减数
        
    Returns:
        减法运算结果
    """
    try:
        result = a - b
        return f"{a} - {b} = {result}"
    except Exception as e:
        return f"减法运算失败: {str(e)}"

@mcp.tool()
def multiply(a: float, b: float) -> str:
    """乘法运算
    
    Args:
        a: 第一个数字
        b: 第二个数字
        
    Returns:
        乘法运算结果
    """
    try:
        result = a * b
        return f"{a} × {b} = {result}"
    except Exception as e:
        return f"乘法运算失败: {str(e)}"

@mcp.tool()
def divide(a: float, b: float) -> str:
    """除法运算
    
    Args:
        a: 被除数
        b: 除数
        
    Returns:
        除法运算结果
    """
    try:
        if b == 0:
            return "错误: 除数不能为零"
        result = a / b
        return f"{a} ÷ {b} = {result}"
    except Exception as e:
        return f"除法运算失败: {str(e)}"

@mcp.tool()
def calculate(expression: str) -> str:
    """计算数学表达式
    
    Args:
        expression: 数学表达式（支持 +, -, *, /, (), 小数）
        
    Returns:
        计算结果
    """
    try:
        # 检查空表达式
        if not expression or not expression.strip():
            return "错误: 表达式不能为空"
        
        # 移除首尾空白字符
        expression = expression.strip()
        
        # 验证表达式只包含安全字符
        allowed_chars = set('0123456789+-*/().' + ' \t\n')
        if not all(c in allowed_chars for c in expression):
            return "错误: 表达式包含不允许的字符，只支持数字、+、-、*、/、()和小数点"
        
        # 检查是否包含连续的*（幂运算符**）
        if '**' in expression:
            return "错误: 不支持幂运算符(**），请使用基本运算符"
        
        # 检查括号是否匹配
        if expression.count('(') != expression.count(')'):
            return "错误: 括号不匹配"
        
        # 检查是否以运算符结尾
        if expression.endswith(('+', '-', '*', '/')):
            return "错误: 表达式不能以运算符结尾"
        
        # 检查是否以运算符开头（除了负号）
        if expression.startswith(('*', '/')):
            return "错误: 表达式不能以*或/开头"
        
        # 安全的计算环境，只允许基本的数学运算
        safe_dict = {"__builtins__": {}}
        
        result = eval(expression, safe_dict)
        return f"表达式: {expression}\n结果: {result}"
    except ZeroDivisionError:
        return "错误: 除零错误"
    except SyntaxError:
        return "语法错误: 表达式格式不正确"
    except Exception as e:
        return f"计算失败: {str(e)}"

@mcp.resource("calculator://operation/{operation}")
def get_operation_info(operation: str) -> str:
    """获取运算操作的说明信息
    
    Args:
        operation: 运算类型 (add, subtract, multiply, divide)
        
    Returns:
        运算操作的详细说明
    """
    operations = {
        "add": "加法运算：计算两个数的和，例如 3 + 5 = 8",
        "subtract": "减法运算：计算两个数的差，例如 10 - 3 = 7",
        "multiply": "乘法运算：计算两个数的积，例如 4 × 6 = 24",
        "divide": "除法运算：计算两个数的商，例如 15 ÷ 3 = 5（注意除数不能为零）"
    }
    
    return operations.get(operation, f"未知的运算类型: {operation}")

if __name__ == "__main__":
    mcp.run(transport="stdio")